package main
import (
	"fmt"
)
//map的使用 ,map是引用类型,map会动态的进行增长键值对，不会发生恐慌panic
func main(){
	//声明方法：var map变量名 map[keyType]valType
	var kvmap map[int]string
	fmt.Println("kvmap : ",kvmap)
	//只声明一个map变量是不能使用的，因为系统没有为其分配数据空间，需要通过 make() 内置函数后才能使用
	kvmap = make(map[int]string,10)
	kvmap[1] = "fmx"
	kvmap[2] = "lsx"
	kvmap[3] = "love"
	kvmap[4] = "lsx"
	//切记：map是无序的，不会因为key大小和插入顺序而排序！
	fmt.Println("kvmap : ",kvmap)
	
	//其他的使用方式：
	//F1:
	var kvmap2 = make(map[string]string)
	kvmap2["lsx"] = "fmx"
	//F2:
	var kvmap3 = map[string]string{
		"fmx":"lsx",
	}
	fmt.Println("kvmap2 : ",kvmap2)
	fmt.Println("kvmap3 : ",kvmap3)

	//map的增删改查
	//如果 key 已存在，那么就是更改操作，如果 key 没有存在，那么就是增加操作
	kvmap3["love"] = "we"
	fmt.Println("kvmap3 : ",kvmap3)	

	//删除操作
	delete(kvmap3,"love")
	fmt.Println("kvmap3 : ",kvmap3)
	//若想删除多个 key 或者说删除所有key
	//1、可以选择for循环遍历逐个删除
	//2、或者直接重新 make 该 map 形成新空间，导致原来的空间被 gc 回收

	//map查找机制
	val,ok := kvmap3["fmx"]  //val保存查到的值，ok保存是否有该k-v
	if ok {
		fmt.Println("找到了，就是：",val)
	}else {
		fmt.Println("没有喔！")		
	}

	//map 遍历： 需要用for - rang 来遍历！
	for k,v := range kvmap {
		fmt.Println("key :",k," value :",v)
	}

	//结构复杂点的map
	studentmap := make(map[string]map[string]string)
	studentmap["10001"] = make(map[string]string)
	studentmap["10001"]["name"] = "fmx"
	studentmap["10001"]["love"] = "lsx"

	studentmap["10002"] = make(map[string]string)
	studentmap["10002"]["name"] = "lsx"
	studentmap["10002"]["love"] = "fmx"

	fmt.Println(studentmap)
	for k1,v1 :=range studentmap{
		for k2,v2 := range v1{
			fmt.Println(k1,"--------",k2,":",v2)
		}
	}

	//可以通过 len() 函数来获取 map 的长度
	fmt.Println("studentMap的长度是： ",len(studentmap))

	//通过结构体作为value更加实用 如下：
	students :=make(map[string]Stu,10)
	students["10001"] = Stu{"fmx",22,"东莞"}
	students["10002"] = Stu{"lsx",22,"普宁"}
	fmt.Println("通过使用结构体的map ： ",students)
	//遍历：
	for k,v :=range students{
		fmt.Println("学生学号：",k)
		fmt.Println("学生姓名：",v.name)
		fmt.Println("学生年龄：",v.age)
		fmt.Println("学生地址：",v.address)
	}
}
type Stu struct{
	name string
	age int
	address string
}